
########################################################################
#			Default Targets
########################################################################

.PHONY: all exe dirs clean 

all : exe dirs
exe : $(EXE)
dirs: $(DIRS)

########################################################################
#			Compilers
########################################################################

CC = gcc
CPP = g++

########################################################################
#			Executable Program Rules
########################################################################

$(EXE) : $(C_SRCS:.c=.o) $(CPP_SRCS:.cpp=.o)
	$(CPP) $(CPPFLAGS) $(LIBS) -o $@ error_code.o $^ 


########################################################################
#			Subdirectories
########################################################################

dirs: $(DIRS)

ifdef DIRS
.PHONY: $(DIRS)
$(DIRS):
	@if [ -e $@/Makefile ] ; then $(MAKE) -C $@ $(MAKECMDGOALS) ; fi
endif

########################################################################
#			Implicit Rules
########################################################################

%.o: %.c
	$(CC) $(CFLAGS) $(INCS) -c $<


%.o: %.cpp
	$(CPP) $(CPPFLAGS) $(INCS) -c $<


%.d: %.c
	@set -e; rm -f $@; $(CC) -MM $(CFLAGS) $(INCS) $< > $@.$$$$; sed 's,\($*\)\.o[ :]*,.o $@ : ,g' < $@.$$$$ > $@; rm -f $@.$$$$


%.d: %.cpp
	@set -e; rm -f $@; $(CPP) -MM $(CPPFLAGS) $(INCS) $< > $@.$$$$; sed 's,\($*\)\.o[ :]*,.o $@ : ,g' < $@.$$$$ > $@; rm -f $@.$$$$


########################################################################
#			Cleanup Rules
########################################################################

clean: $(DIRS)
	rm -f *.o *.d *.d.* $(EXE)

########################################################################
#			Dependencies
########################################################################

-include $(CPP_SRCS:.cpp=.d) $(C_SRCS:.c=.d)